﻿using AJWPFAdmin.Core.Utils;
using AJWPFAdmin.Core.Validation;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace AJWPFAdmin.Core.Models.EF.Tables
{

    public partial class Car
    {
        /// <summary>
        /// 编号信息, 存储可能来自第三方接口的一些台账数据, 到时候要填充到台账记录的
        /// </summary>
        [NotMapped]
        public string Code { get; set; }

        /// <summary>
        /// 发货单位,存储可能来自第三方接口的一些台账数据, 到时候要填充到台账记录的
        /// </summary>
        [NotMapped]
        public string Sender { get; set; }

        /// <summary>
        /// 收货单位,存储可能来自第三方接口的一些台账数据, 到时候要填充到台账记录的
        /// </summary>
        [NotMapped]
        public string Receiver { get; set; }

        /// <summary>
        /// 物资收发标记,存储可能来自第三方接口的一些台账数据, 到时候要填充到台账记录的
        /// </summary>
        [NotMapped]
        [AJNotCopyField]
        public string SendOrReceiveFlag { get; set; }

        /// <summary>
        /// 入厂物资类型,存储可能来自第三方接口的一些台账数据, 到时候要填充到台账记录的
        /// </summary>
        [NotMapped]
        public string InGoodsType { get; set; }

        /// <summary>
        /// 出厂物资类型,存储可能来自第三方接口的一些台账数据, 到时候要填充到台账记录的
        /// </summary>
        [NotMapped]
        public string OutGoodsType { get; set; }

        /// <summary>
        /// 来自小程序预约接口的一些地磅称重信息,后续某些环节要用 --阿吉 2024年11月25日15点18分
        /// </summary>
        [NotMapped]
        public WeighingDataCache WeighingCacheData { get; set; }

        /// <summary>
        /// 是否是本地临时车升级到台账车 --阿吉 2025年5月9日19点09分
        /// </summary>
        [NotMapped]
        public bool LocalTempLevelupToLedger { get; set; }

        public void CompleteFileUrls(CarIdentificationConfig carIdentificationConfig, string propName)
        {

            var atts = GetFilesOfPropertyName(propName, out var prop);
            if (atts.Length > 0)
            {
                prop.SetValue(this, CommonUtil.AJSerializeObject(atts.Select(p => carIdentificationConfig.CompleteFileUrl(CarNo, p))));
            }
        }

        public string GetFileOfPropertyName(string propName)
        {
            var prop = this.GetType().GetRuntimeProperties().FirstOrDefault(p => propName.Equals(p.Name, StringComparison.OrdinalIgnoreCase));
            if (prop == null)
            {
                return string.Empty;
            }

            var array = CommonUtil.TryGetJSONObject<string[]>(prop.GetValue(this) as string) ?? Array.Empty<string>();
            return array.FirstOrDefault() ?? string.Empty;
        }

        public string[] GetFilesOfPropertyName(string propName)
        {
            var prop = this.GetType().GetRuntimeProperties().FirstOrDefault(p => propName.Equals(p.Name, StringComparison.OrdinalIgnoreCase));
            if (prop == null)
            {
                return Array.Empty<string>();
            }

            return CommonUtil.TryGetJSONObject<string[]>(prop.GetValue(this) as string) ?? Array.Empty<string>();
        }

        public string[] GetFilesOfPropertyName(string propName, out PropertyInfo propInfo)
        {
            propInfo = this.GetType().GetRuntimeProperties().FirstOrDefault(p => propName.Equals(p.Name, StringComparison.OrdinalIgnoreCase));
            if (propInfo == null)
            {
                return Array.Empty<string>();
            }
            return CommonUtil.TryGetJSONObject<string[]>(propInfo.GetValue(this) as string) ?? Array.Empty<string>();
        }

    }
}
